package main

import (
	"math/rand"
	"time"
	"fmt"
)

//生成一个四位数
func Data(a *int)  {
	rand.Seed(time.Now().UnixNano())
	//因为go语言里的rand 不能像PHP里一样，可以指定区间，这里只能指定一个最大数，所以有可能随机出来的数是不是一个四位数，所以这里使用了一个for无限循环生成随机数，
	//直到这个数是一个四位数就跳出for循环
	var num int
	for {
		num = rand.Intn(10000)
		if num >= 1000 {
			break
		}
	}
	//fmt.Println(num)
	*a = num
}

//使用水仙花数取出每一位数字,以1234为例
func every(a []int, b int)  {
	//1234 / 1000 = 1
	a[0] = b / 1000
	//1234 % 1000 = 234
	//234 / 100 = 2
	a[1] = b % 1000 / 100
	//1234 % 100 = 34
	//34 / 10 = 3
	a[2] = b % 100 / 10
	//1234 / 10  = 4
	a[3] = b % 10
}

//游戏逻辑
func game(randSlice []int)  {
	var num int
	a := make([]int, 4)
	for {
		for  {
			fmt.Printf("请输入一个四位数整数:\n")
			fmt.Scan(&num)
			if 999 < num && num < 10000 {
				break
			}
			fmt.Printf("格式不正确\n")
		}
		fmt.Println(num)
		every(a, num)
		n := 0
		for i := 0; i < 4; i++ {
			if a[i] > randSlice[i] {
				fmt.Printf("第%d位大了一点\n", i + 1)
			} else if a[i] < randSlice[i] {
				fmt.Printf("第%d位小了一点\n", i + 1)
			} else {
				fmt.Printf("第%d位猜对了\n", i + 1)
				n++
			}
		}

		if n == 4 {
			fmt.Println("恭喜你全部猜对了！！！")
			time.Sleep(time.Second * 2)
			break
		}
	}
}
/**
	游戏逻辑
	1、调用Data方法，这个方法会使用随机数生成一个四位数，这个就是最后的答案
	2、调用一个切片，然后调用every()方法将生成的四位数放在切片里，作为和用户输入的数作比较的标准
	3、game方法的具体逻辑，利用一个for无限循环，首先判断用户的输入的是不是一个四位数，如果不是，继续输入，如果是，就将这个输入的数利用every()写入到一个新的切片里，
    然后进行比较，那用户输入的数字组成的切片和之前随机生成的切片做遍历比较，将比较的结果输出到终端，全部正确跳出for循环，游戏结束
 */
func main()  {
	var a int
	Data(&a)
	//fmt.Printf("a = %d\n", a)
	b := make([]int, 4)
	every(b, a)
	//fmt.Println("b =", b)
	game(b)
	time.After(time.Second * 2)
}
